/**
 * 新榜对接
 */
import { Service } from '@gnlab/utils'
import { MemSubject } from '@gnlab/utils/rx'
import type { Services } from '@/services'
import { API } from '@/services/common/api'
import { splitContactId } from '../contacts'

export interface Config {
  enable: boolean // 是否开启新榜数据获取功能
  idPattern: string // 公众号ID提取正则，为空代表未配置
}

/**
 * 公众号数据
 */
export interface OfficialData {
  ghid: string // 公众号原始ID（gh_xxxxx）
  account: string // 公众号ID（如 gnlab）
  name: string // 公众号名称
  type: string // 公众号类型
  readNum: number // 月均阅读量
  likeNum: number // 月均“在看”点击量
  preLikeNum: number // 月均点赞量
  commentNum: number // 月均评论量
  updated: Date // 数据获取时间
}

interface RawOfficialData {
  GhId: string
  Account: string
  Name: string
  Type: string
  AvgCommentNum: number
  AvgLikeNum: number
  AvgPreLike: number
  AvgReadNum: number
  UpdateTime: string // '2023-01-16T05:52:55.061Z'
}
function formatRawOfficialData(raw: RawOfficialData | null): OfficialData | null {
  if (!raw) return null
  return {
    ghid: raw.GhId,
    account: raw.Account,
    name: raw.Name,
    type: raw.Type,
    readNum: raw.AvgReadNum,
    likeNum: raw.AvgLikeNum,
    preLikeNum: raw.AvgPreLike,
    commentNum: raw.AvgCommentNum,
    updated: new Date(raw.UpdateTime),
  }
}

/**
 * 文章数据
 */
export interface ArticleData {
  title: string // 文章标题
  url: string // 文章链接
  readNum: number // 阅读量
  likeNum: number // “在看”点击量
  preLikeNum: number // 点赞量
  commentNum: number // 评论量
  publicTime: Date // 发布时间
}

interface RawArticleData {
  Title: string
  Url: string
  ReadNum: number
  LikeNum: number
  PreLike: number
  CommentNum: number
  PublicTime: string
}
function formatRawArticleData(raw: RawArticleData): ArticleData {
  return {
    title: raw.Title,
    url: raw.Url,
    readNum: raw.ReadNum,
    likeNum: raw.LikeNum,
    preLikeNum: raw.PreLike,
    commentNum: raw.CommentNum,
    publicTime: new Date(raw.PublicTime),
  }
}

/**
 * 搜索得到的公众号信息
 */
export interface SearchedOfficial {
  ghid: string // 公众号原始ID（gh_xxxxx）
  account: string // 公众号ID（如 gnlab）
  name: string // 公众号名称
  avatar: string // 公众号图标
  description: string // 公众号描述
  type: string // 公众号类型
  weekNri: number // 新榜周指数(保留两位小数)
  joined: Date // 加入新榜样本库的时间
}

interface RawSearchedOfficial {
  GhId: string
  Account: string
  Name: string
  HeadImageUrl: string
  Description: string
  Type: string
  JoinDate: string
  WeekNri: number
}
function formatRawSearchedOfficial(raw: RawSearchedOfficial | null): SearchedOfficial | null {
  if (!raw) return null
  return {
    ghid: raw.GhId,
    account: raw.Account,
    name: raw.Name,
    avatar: raw.HeadImageUrl,
    description: raw.Description,
    type: raw.Type,
    weekNri: Math.round(raw.WeekNri * 100) / 100,
    joined: new Date(raw.JoinDate),
  }
}

// ========== 服务实现 =============================

export const configSubject = new MemSubject<Config | null>(null)

export class NewRank extends Service<Services> {
  private get auth() {
    return this.services.auth
  }

  registered() {
    void this.auth.accountId.then(() => {
      void this.loadConfig()
    })
  }

  // 当前设置值；为 null 代表正在加载
  config = configSubject

  async loadConfig() {
    const res = await API('/NewRank/Config', {
      formatter(raw: { Enable: boolean; Regex: string } | null): Config {
        return { enable: raw?.Enable ?? false, idPattern: raw?.Regex ?? '' }
      },
    })
    if (res.success) {
      this.config.next(res.data)
    } else {
      NewRank.logger.warn('新榜配置加载失败')
      this.config.next({ enable: false, idPattern: '' })
    }
  }

  async saveConfig(config: Config) {
    this.config.next(config)
    return API('/NewRank/SaveConfig', {
      data: {
        enable: config.enable,
        regex: config.idPattern,
      },
    })
  }

  /**
   * 从数据库中获取此联系人绑定的公众号的新榜数据
   */
  async getData(contactId: string) {
    const [ownerWxid, contactUserId] = splitContactId(contactId)
    return API('/NewRank/Account', {
      data: { wxid: ownerWxid, contactUserId },
      formatter: formatRawOfficialData,
    })
  }

  /**
   * 通过新榜接口拉取公众号数据并绑定到此联系人
   */
  async fetchDataFromNewRank(contactId: string, ghid: string) {
    const [ownerWxid, contactUserId] = splitContactId(contactId)
    return API('/NewRank/Refresh', {
      data: { wxid: ownerWxid, contactUserId, ghid },
      formatter: formatRawOfficialData,
    })
  }

  async getArticles(contactId: string) {
    const [ownerWxid, contactUserId] = splitContactId(contactId)
    return API('/NewRank/Articles', {
      data: { wxid: ownerWxid, contactUserId },
      formatter(raw: RawArticleData[] | null) {
        return (raw ?? []).map(formatRawArticleData)
      },
    })
  }

  /**
   * 搜索公众号（此接口会扣费，尽可能降低调用频率）
   */
  async search(keyword: string, page: number) {
    // === 测试用代码，避免频繁调用付费接口 ===
    // if (keyword === '跨境' && page <= 5) {
    //   return Promise.resolve({
    //     success: true as const,
    //     data: formatRawSearchedOfficial({
    //       GhId: 'gh_7d65eb8e632c',
    //       Account: 'ec-news',
    //       Name: '跨境必读 - ' + page.toString(),
    //       Type: 'type',
    //       HeadImageUrl: 'http://mmbiz.qpic.cn/mmbiz_png/W2fPKabw2eapxzdW49UBSOVYEXZk1XYDG4CXH2N95ajmAnNt4avq27NTYeUUPPo2AM6AZ5NPNdyiafz3zhBqtGg/0?wx_fmt=png',
    //       Type: '创业',
    //       JoinDate: '2016-01-04 16:42:22',
    //       WeekNri: 675.7923195830948,
    //       Description: '了解跨境电商一切事！sadfadfasdfsadfadfasdfsadfadfasdfsadfadfasdfsadfadfasdfsadfadfasdf'
    //     })
    //   })
    // } else if (keyword === 'error') {
    //   return Promise.resolve({ success: false as const, error: 'custom-error' })
    // } else {
    //   return Promise.resolve({ success: true as const, data: null })
    // }

    return API('/NewRank/Search', {
      data: { keyword, pageIndex: page },
      formatter: formatRawSearchedOfficial,
    })
  }
}
